package com.chenjun.designpattern.structural.composite;

import java.util.ArrayList;
import java.util.List;

/**
 <p>
 * 定义(GoF《设计模式》)：
 将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和使用具有一致性。
 </p>
 <p>
 什么情况下使用组合模式 ?
引用大话设计模式的片段：“当发现需求中是体现部分与整体层次结构时
以及你希望用户可以忽略组合对象与单个对象的不同，
统一地使用组合结构中的所有对象时，就应该考虑组合模式了。”
 </p>
 <p>
 
 </p>
 * @author admin
 *
 */
public class 组合模式
{

	public static void main(String[] args)
	{
		Component component = new Composite("根节点");
		Component child = new Composite("一级子节点child");
		Component child_child_1 = new Composite("一级子节点的叶子节点child_child_1");
		Component child_child_2 = new Composite("一级子节点的叶子节点child_child_2");

		child.add(child_child_1);
		child.add(child_child_2);

		Component child2 = new Composite("一级子节点child2");
		component.add(child);
		component.add(child2);
		component.foreach();
	}

}

abstract class Component
{
	protected String name;

	public Component(String name)
	{
		this.name = name;
	}

	public abstract void add(Component component);

	public abstract void remove(Component component);

	public abstract void foreach();
}

class Composite extends Component
{
	private List<Component> child = new ArrayList<Component>();

	public Composite(String name)
	{
		super(name);
	}

	@Override
	public void add(Component component)
	{
		child.add(component);
	}

	@Override
	public void remove(Component component)
	{
		child.remove(component);
	}

	@Override
	public void foreach()
	{
		System.out.println("节点名：\t" + name);
		for (Component c : child)
		{
			c.foreach();
		}
	}
}

class Leaf extends Component
{
	public Leaf(String name)
	{
		super(name);
	}

	@Override
	public void add(Component component)
	{

	}

	@Override
	public void remove(Component component)
	{

	}

	@Override
	public void foreach()
	{
		System.out.println("leaf: \t\t" + this.toString());
	}
}